home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / Miro_Downloader.exe / compiled_templates / download.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-11-12  |  33.0 KB  |  480 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. from template import Handle, fillAttr, quoteAndFillAttr, fillStaticTemplate
  5. from StringIO import StringIO
  6. from xhtmltools import urlencode
  7. from templatehelper import quoteattr, escape
  8. from string import Template
  9. import app
  10. import views
  11. import sorts
  12. import indexes
  13. import filters
  14. import resources
  15. import gtcache
  16. _ = gtcache.gettext
  17.  
  18. def fillTemplate(domHandler, dtvPlatform, eventCookie, bodyTagExtra, *args, **kargs):
  19.     global searchFilter
  20.     import config
  21.     import prefs
  22.     import platformutils
  23.     import util
  24.     import downloader
  25.     _ = gettext
  26.     import gtcache
  27.     
  28.     def getFreeSpace():
  29.         bytes = platformutils.getAvailableBytesForMovies()
  30.         return util.formatSizeForUser(bytes, '0B', False)
  31.  
  32.     
  33.     def getAvailableSpace():
  34.         bytes = platformutils.getAvailableBytesForMovies()
  35.         if config.get(prefs.PRESERVE_DISK_SPACE):
  36.             preserved = config.get(prefs.PRESERVE_X_GB_FREE) * 1024 * 1024 * 1024
  37.             bytes -= preserved
  38.         
  39.         return util.formatSizeForUser(bytes, '0B', False)
  40.  
  41.     
  42.     def getUpRate():
  43.         return _('%0.1f KB/s uploading') % (downloader.totalUpRate / 1024,)
  44.  
  45.     
  46.     def getDownRate():
  47.         return _('%0.1f KB/s downloading') % (downloader.totalDownRate / 1024,)
  48.  
  49.     
  50.     searchFilter = lambda x: filters.matchingItems(x, None)
  51.     
  52.     def makeDownloadCategoryView(cat):
  53.         return views.downloadingItems.filterWithIndex(indexes.downloadsByCategory, cat)
  54.  
  55.     allNormalDownloads = makeDownloadCategoryView('normal')
  56.     allExternalDownloads = views.items.filter((lambda x: if x.getFeed().url == 'dtv:manualFeed':
  57. passx.isNonVideoFile()))
  58.     allUploads = views.items.filter((lambda x: if x.downloader and x.downloader.getState() == 'uploading':
  59. if x.getFeed().url == 'dtv:manualFeed':
  60. passnot x.isNonVideoFile()))
  61.     allPendingDownloads = makeDownloadCategoryView('pending')
  62.     allPausedDownloads = views.pausedItems.filter((lambda x: if x.getFeed().url == 'dtv:manualFeed':
  63. passnot x.isNonVideoFile()))
  64.     matchingNormalDLs = allNormalDownloads.filter((lambda x: searchFilter(x)), sortFunc = sorts.itemSortDownloads.sort, resort = True)
  65.     matchingExternalDLs = allExternalDownloads.filter((lambda x: searchFilter(x)))
  66.     matchingULs = allUploads.filter((lambda x: searchFilter(x)), sortFunc = sorts.itemSortSeedingTorrents.sort, resort = True)
  67.     matchingPendingDLs = allPendingDownloads.filter((lambda x: searchFilter(x)), sortFunc = sorts.itemSortDownloads.sort, resort = True)
  68.     matchingPausedDLs = allPausedDownloads.filter((lambda x: searchFilter(x)), sortFunc = sorts.itemSortDownloads.sort, resort = True)
  69.     
  70.     def updateSearchString(newSearch):
  71.         global searchFilter, searchFilter
  72.         allNormalDownloads.recomputeFilter(matchingNormalDLs)
  73.         allExternalDownloads.recomputeFilter(matchingExternalDLs)
  74.         allUploads.recomputeFilter(matchingULs)
  75.         allPendingDownloads.recomputeFilter(matchingPendingDLs)
  76.         allPausedDownloads.recomputeFilter(matchingPausedDLs)
  77.  
  78.     
  79.     def setSortBy(by, which, handle):
  80.         if which == 'main':
  81.             sorts.itemSortDownloads.setSortBy(by)
  82.             allNormalDownloads.recomputeSort(matchingNormalDLs)
  83.             allPendingDownloads.recomputeSort(matchingPendingDLs)
  84.             allPausedDownloads.recomputeSort(matchingPausedDLs)
  85.         else:
  86.             sorts.itemSortSeedingTorrents.setSortBy(by)
  87.             allUploads.recomputeSort(matchingULs)
  88.         handle.forceUpdate()
  89.  
  90.     
  91.     def _execOnUnload():
  92.         allNormalDownloads.unlink()
  93.         allExternalDownloads.unlink()
  94.         allUploads.unlink()
  95.         allPendingDownloads.unlink()
  96.         allPausedDownloads.unlink()
  97.  
  98.     localvars = locals()
  99.     localvars.update(globals())
  100.     handle = Handle(domHandler, localvars, onUnlink = _execOnUnload)
  101.     
  102.     def up_0_handle(viewName, view, tid):
  103.         out = StringIO()
  104.         out.write(u'<div id="')
  105.         out.write(quoteattr(tid))
  106.         out.write(u'">\n                <ul class="download-rates">\n                    ')
  107.         if not not (downloader.totalDownRate > 1):
  108.             out.write(u'<li>\n                        <span>')
  109.             out.write(escape(getDownRate()))
  110.             out.write(u'</span>\n                    </li>')
  111.         
  112.         out.write(u'\n                    ')
  113.         if not not (downloader.totalUpRate > 1):
  114.             out.write(u'<li>\n                        <span>')
  115.             out.write(escape(getUpRate()))
  116.             out.write(u'</span>\n                    </li>')
  117.         
  118.         out.write(u'\n                </ul>\n            </div>')
  119.         out.seek(0)
  120.         return out
  121.  
  122.     handle.addUpdate('tmplcomp88112482', 'nextSibling', views.remoteDownloads, up_0_handle, u'views.remoteDownloads')
  123.     
  124.     def up_1_handle(viewName, view, tid):
  125.         out = StringIO()
  126.         out.write(u'<div id="')
  127.         out.write(quoteattr(tid))
  128.         out.write(u'"> \n        ')
  129.         if not matchingNormalDLs.len() + matchingPendingDLs.len() + matchingPausedDLs.len() == 0:
  130.             out.write(u'<div>\n            ')
  131.             out.write(fillStaticTemplate(u'static-tab-sort-bar', onlyBody = True, section = 'main', itemSort = sorts.itemSortDownloads))
  132.             out.write(u'\n        </div>')
  133.         
  134.         out.write(u'\n    </div>')
  135.         out.seek(0)
  136.         return out
  137.  
  138.     handle.addUpdate('tmplcomp97887793', 'nextSibling', views.downloadingItems, up_1_handle, u'views.downloadingItems')
  139.     
  140.     def up_2_handle(viewName, view, tid):
  141.         out = StringIO()
  142.         out.write(u'<div id="')
  143.         out.write(quoteattr(tid))
  144.         out.write(u'">\n        ')
  145.         if not matchingExternalDLs.len() == 0:
  146.             out.write(u'<div>\n            <div class="main-channelbar downloading-channelbar no-arrow">\n                <span>')
  147.             out.write(_(u'External Downloads'))
  148.             out.write(u'</span>\n                <a title="Clear Completed and Failed Downloads" href="#" onclick="return eventURL(\'action:clearTorrents\');" class="clear-completed-link">')
  149.             out.write(_(u'Clear Completed and Failed Downloads'))
  150.             out.write(u'</a>\n            </div>\n        </div>')
  151.         
  152.         out.write(u'\n    </div>')
  153.         out.seek(0)
  154.         return out
  155.  
  156.     handle.addUpdate('tmplcomp22972243', 'nextSibling', matchingExternalDLs, up_2_handle, u'matchingExternalDLs')
  157.     
  158.     def up_3_handle(viewName, view, tid):
  159.         out = StringIO()
  160.         out.write(u'<div id="')
  161.         out.write(quoteattr(tid))
  162.         out.write(u'">\n        ')
  163.         if not matchingULs.len() == 0:
  164.             out.write(u'<div>\n            <div class="main-channelbar seeding-channelbar no-arrow">\n                <span>')
  165.             out.write(_(u'Seeding Torrents'))
  166.             out.write(u'</span>\n            </div>\n            ')
  167.             out.write(fillStaticTemplate(u'static-tab-sort-bar', onlyBody = True, section = 'seeding-torrents', itemSort = sorts.itemSortSeedingTorrents))
  168.             out.write(u'\n        </div>')
  169.         
  170.         out.write(u'\n    </div>')
  171.         out.seek(0)
  172.         return out
  173.  
  174.     handle.addUpdate('tmplcomp18152374', 'nextSibling', matchingULs, up_3_handle, u'matchingULs')
  175.     
  176.     def config_up_4_handle(tid):
  177.         out = StringIO()
  178.         out.write(u'<span id="')
  179.         out.write(quoteattr(tid))
  180.         out.write(u'">\n                        ')
  181.         if not getFreeSpace() == getAvailableSpace():
  182.             out.write(u'<span>\n                            <span>')
  183.             tmplcomp84787959 = { }
  184.             tmplcomp78966868 = StringIO()
  185.             tmplcomp78966868.write(u'<span>')
  186.             tmplcomp78966868.write(escape(getAvailableSpace()))
  187.             tmplcomp78966868.write(u'</span>')
  188.             tmplcomp78966868.seek(0)
  189.             tmplcomp84787959['size'] = tmplcomp78966868.read()
  190.             out.write(Template(_(u'${size} free for downloads')).substitute(tmplcomp84787959))
  191.             out.write(u'</span>\n                        </span>')
  192.         
  193.         out.write(u'\n                    </span>')
  194.         out.seek(0)
  195.         return out
  196.  
  197.     handle.addConfigUpdate('tmplcomp80638800', 'nextSibling', config_up_4_handle)
  198.     
  199.     def rep_5_handle(this, viewName, view, tid):
  200.         out = StringIO()
  201.         out.write(u'\n<div dragsourcetype="')
  202.         out.write(quoteattr(this.getDragType()))
  203.         out.write(u'" selectArea="itemlist" drageffectdownloadeditem="move" dragdestdata="playlistitem-')
  204.         out.write(quoteattr(this.getID()))
  205.         out.write(u'" dragicon="video-tnail-')
  206.         out.write(quoteattr(viewName + str(this.getID())))
  207.         out.write(u'" selectID="')
  208.         out.write(quoteattr(this.getID()))
  209.         out.write(u'" class="main-video draggable ')
  210.         out.write(quoteattr(this.getSelectedState(view)))
  211.         out.write(u' ')
  212.         out.write(quoteattr(this.getMoreInfoState()))
  213.         out.write(u'" dragsourcedata="itemlist-')
  214.         out.write(quoteattr(this.getID()))
  215.         out.write(u'" onclick="return handleSelect(event);" selectViewName="')
  216.         out.write(quoteattr(urlencode(viewName)))
  217.         out.write(u'" onmousedown="return handleContextMenuSelect(event);" dragdesttype="')
  218.         if not viewName == 'playlistView' or 'downloadeditem':
  219.             pass
  220.         out.write(quoteattr(''))
  221.         out.write(u'" ondblclick="return handleDblClick(event, \'')
  222.         out.write(quoteattr(urlencode(viewName)))
  223.         out.write(u"', ")
  224.         out.write(quoteattr(urlencode(this.getID())))
  225.         out.write(u');" id="')
  226.         out.write(quoteattr(tid))
  227.         out.write(u'">\n    <div>')
  228.         out.write(this.getItemXML(viewName))
  229.         out.write(u'</div>\n</div>\n')
  230.         out.seek(0)
  231.         return out
  232.  
  233.     handle.addView('tmplcomp76085414', 'containerDiv', matchingNormalDLs, rep_5_handle, u'matchingNormalDLs')
  234.     
  235.     def rep_6_handle(this, viewName, view, tid):
  236.         out = StringIO()
  237.         out.write(u'\n<div dragsourcetype="')
  238.         out.write(quoteattr(this.getDragType()))
  239.         out.write(u'" selectArea="itemlist" drageffectdownloadeditem="move" dragdestdata="playlistitem-')
  240.         out.write(quoteattr(this.getID()))
  241.         out.write(u'" dragicon="video-tnail-')
  242.         out.write(quoteattr(viewName + str(this.getID())))
  243.         out.write(u'" selectID="')
  244.         out.write(quoteattr(this.getID()))
  245.         out.write(u'" class="main-video draggable ')
  246.         out.write(quoteattr(this.getSelectedState(view)))
  247.         out.write(u' ')
  248.         out.write(quoteattr(this.getMoreInfoState()))
  249.         out.write(u'" dragsourcedata="itemlist-')
  250.         out.write(quoteattr(this.getID()))
  251.         out.write(u'" onclick="return handleSelect(event);" selectViewName="')
  252.         out.write(quoteattr(urlencode(viewName)))
  253.         out.write(u'" onmousedown="return handleContextMenuSelect(event);" dragdesttype="')
  254.         if not viewName == 'playlistView' or 'downloadeditem':
  255.             pass
  256.         out.write(quoteattr(''))
  257.         out.write(u'" ondblclick="return handleDblClick(event, \'')
  258.         out.write(quoteattr(urlencode(viewName)))
  259.         out.write(u"', ")
  260.         out.write(quoteattr(urlencode(this.getID())))
  261.         out.write(u');" id="')
  262.         out.write(quoteattr(tid))
  263.         out.write(u'">\n    <div>')
  264.         out.write(this.getItemXML(viewName))
  265.         out.write(u'</div>\n</div>\n')
  266.         out.seek(0)
  267.         return out
  268.  
  269.     handle.addView('tmplcomp83877438', 'containerDiv', matchingPendingDLs, rep_6_handle, u'matchingPendingDLs')
  270.     
  271.     def rep_7_handle(this, viewName, view, tid):
  272.         out = StringIO()
  273.         out.write(u'\n<div dragsourcetype="')
  274.         out.write(quoteattr(this.getDragType()))
  275.         out.write(u'" selectArea="itemlist" drageffectdownloadeditem="move" dragdestdata="playlistitem-')
  276.         out.write(quoteattr(this.getID()))
  277.         out.write(u'" dragicon="video-tnail-')
  278.         out.write(quoteattr(viewName + str(this.getID())))
  279.         out.write(u'" selectID="')
  280.         out.write(quoteattr(this.getID()))
  281.         out.write(u'" class="main-video draggable ')
  282.         out.write(quoteattr(this.getSelectedState(view)))
  283.         out.write(u' ')
  284.         out.write(quoteattr(this.getMoreInfoState()))
  285.         out.write(u'" dragsourcedata="itemlist-')
  286.         out.write(quoteattr(this.getID()))
  287.         out.write(u'" onclick="return handleSelect(event);" selectViewName="')
  288.         out.write(quoteattr(urlencode(viewName)))
  289.         out.write(u'" onmousedown="return handleContextMenuSelect(event);" dragdesttype="')
  290.         if not viewName == 'playlistView' or 'downloadeditem':
  291.             pass
  292.         out.write(quoteattr(''))
  293.         out.write(u'" ondblclick="return handleDblClick(event, \'')
  294.         out.write(quoteattr(urlencode(viewName)))
  295.         out.write(u"', ")
  296.         out.write(quoteattr(urlencode(this.getID())))
  297.         out.write(u');" id="')
  298.         out.write(quoteattr(tid))
  299.         out.write(u'">\n    <div>')
  300.         out.write(this.getItemXML(viewName))
  301.         out.write(u'</div>\n</div>\n')
  302.         out.seek(0)
  303.         return out
  304.  
  305.     handle.addView('tmplcomp01838538', 'containerDiv', matchingPausedDLs, rep_7_handle, u'matchingPausedDLs')
  306.     
  307.     def rep_8_handle(this, viewName, view, tid):
  308.         out = StringIO()
  309.         out.write(u'\n<div dragsourcetype="')
  310.         out.write(quoteattr(this.getDragType()))
  311.         out.write(u'" selectArea="itemlist" drageffectdownloadeditem="move" dragdestdata="playlistitem-')
  312.         out.write(quoteattr(this.getID()))
  313.         out.write(u'" dragicon="video-tnail-')
  314.         out.write(quoteattr(viewName + str(this.getID())))
  315.         out.write(u'" selectID="')
  316.         out.write(quoteattr(this.getID()))
  317.         out.write(u'" class="main-video draggable ')
  318.         out.write(quoteattr(this.getSelectedState(view)))
  319.         out.write(u' ')
  320.         out.write(quoteattr(this.getMoreInfoState()))
  321.         out.write(u'" dragsourcedata="itemlist-')
  322.         out.write(quoteattr(this.getID()))
  323.         out.write(u'" onclick="return handleSelect(event);" selectViewName="')
  324.         out.write(quoteattr(urlencode(viewName)))
  325.         out.write(u'" onmousedown="return handleContextMenuSelect(event);" dragdesttype="')
  326.         if not viewName == 'playlistView' or 'downloadeditem':
  327.             pass
  328.         out.write(quoteattr(''))
  329.         out.write(u'" ondblclick="return handleDblClick(event, \'')
  330.         out.write(quoteattr(urlencode(viewName)))
  331.         out.write(u"', ")
  332.         out.write(quoteattr(urlencode(this.getID())))
  333.         out.write(u');" id="')
  334.         out.write(quoteattr(tid))
  335.         out.write(u'">\n    <div>')
  336.         out.write(this.getItemXML(viewName))
  337.         out.write(u'</div>\n</div>\n')
  338.         out.seek(0)
  339.         return out
  340.  
  341.     handle.addView('tmplcomp12152205', 'containerDiv', matchingExternalDLs, rep_8_handle, u'matchingExternalDLs')
  342.     
  343.     def rep_9_handle(this, viewName, view, tid):
  344.         out = StringIO()
  345.         out.write(u'\n<div dragsourcetype="')
  346.         out.write(quoteattr(this.getDragType()))
  347.         out.write(u'" selectArea="itemlist" drageffectdownloadeditem="move" dragdestdata="playlistitem-')
  348.         out.write(quoteattr(this.getID()))
  349.         out.write(u'" dragicon="video-tnail-')
  350.         out.write(quoteattr(viewName + str(this.getID())))
  351.         out.write(u'" selectID="')
  352.         out.write(quoteattr(this.getID()))
  353.         out.write(u'" class="main-video draggable ')
  354.         out.write(quoteattr(this.getSelectedState(view)))
  355.         out.write(u' ')
  356.         out.write(quoteattr(this.getMoreInfoState()))
  357.         out.write(u'" dragsourcedata="itemlist-')
  358.         out.write(quoteattr(this.getID()))
  359.         out.write(u'" onclick="return handleSelect(event);" selectViewName="')
  360.         out.write(quoteattr(urlencode(viewName)))
  361.         out.write(u'" onmousedown="return handleContextMenuSelect(event);" dragdesttype="')
  362.         if not viewName == 'playlistView' or 'downloadeditem':
  363.             pass
  364.         out.write(quoteattr(''))
  365.         out.write(u'" ondblclick="return handleDblClick(event, \'')
  366.         out.write(quoteattr(urlencode(viewName)))
  367.         out.write(u"', ")
  368.         out.write(quoteattr(urlencode(this.getID())))
  369.         out.write(u');" id="')
  370.         out.write(quoteattr(tid))
  371.         out.write(u'">\n    <div>')
  372.         out.write(this.getItemXML(viewName))
  373.         out.write(u'</div>\n</div>\n')
  374.         out.seek(0)
  375.         return out
  376.  
  377.     handle.addView('tmplcomp99504900', 'containerDiv', matchingULs, rep_9_handle, u'matchingULs')
  378.     localvars = locals()
  379.     localvars.update(globals())
  380.     handle_0 = Handle(domHandler, localvars, onUnlink = (lambda : None))
  381.     handle.addSubHandle(handle_0)
  382.     localvars = locals()
  383.     localvars.update(globals())
  384.     handle_1 = Handle(domHandler, localvars, onUnlink = (lambda : None))
  385.     handle.addSubHandle(handle_1)
  386.     localvars = locals()
  387.     localvars.update(globals())
  388.     handle_2 = Handle(domHandler, localvars, onUnlink = (lambda : None))
  389.     handle.addSubHandle(handle_2)
  390.     localvars = locals()
  391.     localvars.update(globals())
  392.     handle_3 = Handle(domHandler, localvars, onUnlink = (lambda : None))
  393.     handle.addSubHandle(handle_3)
  394.     localvars = locals()
  395.     localvars.update(globals())
  396.     handle_4 = Handle(domHandler, localvars, onUnlink = (lambda : None))
  397.     handle.addSubHandle(handle_4)
  398.     out = StringIO()
  399.     out.write(u'<?xml version="1.0" encoding="utf-8"?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n')
  400.     out.write(u'<html dtvPlatform="')
  401.     out.write(quoteattr(urlencode(dtvPlatform)))
  402.     out.write(u'" eventCookie="')
  403.     out.write(quoteattr(urlencode(eventCookie)))
  404.     out.write(u'" xmlns="http://www.w3.org/1999/xhtml">\n<head>\n<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type"></meta>\n\n<link href="')
  405.     out.write(quoteattr(resources.url(u'css/main.css')))
  406.     out.write(u'" type="text/css" rel="stylesheet"></link>\n<link href="')
  407.     out.write(quoteattr(resources.url(u'css/download.css')))
  408.     out.write(u'" type="text/css" rel="stylesheet"></link>\n<script src="')
  409.     out.write(quoteattr(resources.url(u'templates/osxdnd.js')))
  410.     out.write(u'" type="text/javascript"></script>\n<script type="text/javascript">\n<!-- // Protect from our XML parser, which doesn\'t know to protect <script>\n\n///////////////////////////////////////////////////////////////////////////////\n//// For use on your page                                                  ////\n///////////////////////////////////////////////////////////////////////////////\n\nfunction getDTVPlatform() {\n    var elt = document.getElementsByTagName("html")[0];\n    return elt.getAttribute(\'dtvPlatform\');\n}\n\nfunction loadURL(url) {\n    try {\n        document.location.href = url;\n    } catch (e) {\n        // This may happen if the backend decides to handle the url load\n        // itself.\n    }\n}\n\n// For calling from page Javascript: Cause a URL to be loaded. The\n// assumption is that the application will notice, abort the load, and\n// take some action based on the URL.\nfunction eventURL(url) {\n    if (typeof(window.frontend) == \'undefined\') {\n\t// Generic strategy: trigger a load, and hope the application\n\t// catches it and cancels it without creating a race\n\t// condition.\n        loadURL(url)\n    } else {\n\t// OS X WebKit (KHTML) strategy: pass in an Objective C object\n\t// through the window object and call a method on it.\n\twindow.frontend.eventURL(url);\n    }\n\n    return false;\n}\n\n// Calls eventURL, then calls event.stopPropagation() and\n// event.preventDefault() so that the event chain is stopped.\nfunction eventURLAndStop(url, event) {\n  eventURL(url);\n  event.stopPropagation();\n  event.preventDefault();\n}\n\nfunction recommendItem(title, url) {\n    loadURL(\'http://www.videobomb.com/index/democracyemail?url=\' + \n            url + \'&title=\' + title);\n    return false;\n}\n\nfunction recommendChannel(title, url) {\n    // See also app.py if changing this URL\n    loadURL(\'http://www.videobomb.com/democracy_channel/email_friend\' +\n        \'?url=\' + url + \'&title=\' + title);\n    return false;\n}\n\n// Start the video player. The playlist will be the items in the view\n// named by viewName. If firstItemId is the id of an item in the view,\n// playback will start on that item; otherwise playback will start on\n// the first item.\nfunction playViewNamed(viewName, firstItemId) {\n    url = \'action:playViewNamed?\';\n    url = url + \'viewName=\' + URLencode(viewName);\n    url = url + \'&firstItemId=\' + URLencode(firstItemId);\n    eventURL(url);\n    return false;\n}\n\n// You can make \'incremental search\' text boxes on your page that\n// effectively tie the text box to the \'parameter\' argument of setViewFilter,\n// with the other argumens fixed. To do this, add these two attributes to\n// the text box:\n//   onfocus="startEditSearch(this)"\n//   onblur="endEditFilter()"\n// replacing the arguments in parentheses with the desired strings.\n//\n// You\'ll also need to provide a updateSearchString function at the\n// top of your template to perform the actual update\n\nvar editSearchField = null;\nvar editSearchOldValue = \'\';\nvar editSearchTimer = null;\nvar editSearchCallback = null;\n\nfunction onSearchFocus(obj){\n  if (obj.getAttribute(\'searching\') != \'1\') {\n\tobj.value="";\n\tobj.searching = \'1\';\n  }\n  startEditSearch(obj, null);\n}\n\nfunction startEditSearch(obj, callback) {\n  editSearchOldValue = obj.value;\n\n  editSearchField = obj;\n  editSearchCallback = callback;\n  editSearchTimerTick();\n}\n\nfunction editSearchUpdate() {\n    value = editSearchField.value;\n    if (editSearchOldValue != value) {\n\turl = \'action:setSearchString?searchString=\' + URLencode(value);\n\teventURL(url);\n\teditSearchOldValue = value;\n\tif(editSearchCallback) editSearchCallback();\n    }\n}\n\nfunction editSearchTimerTick() {\n    editSearchUpdate();\n    editSearchTimer = setTimeout(editSearchTimerTick, 50);\n}\n\nfunction endEditSearch() {\n  clearTimeout(editSearchTimer);\n  editSearchUpdate();\n}\n\n// Internal use: \'URL encode\' the given string.\nfunction URLencode(str) {\n    return encodeURIComponent(str)\n}\n\nfunction URLdecode(str) {\n  return decodeURIComponent(str)\n}\n\nvar currentSelectBoxMenu = null;\nfunction showSelectBoxMenu(id) {\n    document.getElementById(id).style.display = \'block\';\n    currentSelectBoxMenu = id;\n    document.addEventListener(\'click\', hideSelectBoxMenu, true)\n}\n\nfunction hideSelectBoxMenu(event) {\n    document.getElementById(currentSelectBoxMenu).style.display = \'\';\n    currentSelectBoxMenu = null;\n    document.removeEventListener(\'click\', hideSelectBoxMenu, true)\n}\n\n///////////////////////////////////////////////////////////////////////////////\n//// For calling by host templating code                                   ////\n///////////////////////////////////////////////////////////////////////////////\n\n// For calling by host templating code: Set CSS styles on the item\n// with the given ID to make it disappear.\nfunction hideItem(id) {\n    elt = document.getElementById(id);\n    elt.style.display = \'none\';\n    forceRedisplay(elt);\n}\n\n// For calling by host templating code: Set CSS styles on the item\n// with the given ID to make it visible if it was previously hidden.\nfunction showItem(id) {\n    elt = document.getElementById(id);\n    elt.style.display = \'\';\n    forceRedisplay(elt);\n}\n\n// For calling by host templating code: Replace the item with the\n// given id with the element described by the proided XML.\nfunction changeItem(id, newXML) {\n    elt = document.getElementById(id);\n    r = document.createRange();\n    r.selectNode(elt);\n    frag = r.createContextualFragment(newXML);\n    elt.parentNode.replaceChild(frag, elt);\n}\n\n// For calling by host templating code: Parse the XML in newXML into a\n// new element, and insert the new element immediately before the item\n// with the given id, such that the newly inserted item has the same\n// parent.\nfunction addItemBefore(newXML, id) {\n    elt = document.getElementById(id);\n    r = document.createRange();\n    r.selectNode(elt);\n    frag = r.createContextualFragment(newXML);\n    elt.parentNode.insertBefore(frag, elt);\n}    \n\n// For calling by host templating code: Parse the XML in newXML into a\n// new element, and insert the new element as the final child of the\n// item with the given id.\nfunction addItemAtEnd(newXML, id) {\n    elt = document.getElementById(id);\n    r = document.createRange();\n    r.selectNode(elt);\n    frag = r.createContextualFragment(newXML);\n    elt.insertBefore(frag, null);\n}    \n\n// For calling by host templating code: Remove the item with the given\n// id.\nfunction removeItem(id) {\n    elt = document.getElementById(id);\n    elt.parentNode.removeChild(elt);\n}    \n\n// Internal use: Sometime if all you do is change the style on a node,\n// Safari doesn\'t update the view until your mouse is next over the\n// window. Force the issue by making a drastic change in the vicinity\n// of the given element and then reversing it.\nfunction forceRedisplay(elt) {\n    r = document.createRange();\n    r.selectNode(elt);\n    frag = r.extractContents();\n    r.insertNode(frag);\n}\n\nfunction handleContextMenuSelect(event) {\n  if(event.button == 2) {\n    var area = event.currentTarget.getAttribute("selectArea");\n    var id = event.currentTarget.getAttribute("selectID");\n    var viewName = event.currentTarget.getAttribute("selectViewName");\n    var url = \'action:handleContextMenuSelect?id=\' + id + \'&area=\' + area +\n              \'&viewName=\' + viewName;\n    eventURL(url);\n  }\n  return true;\n}\n\nfunction handleSelect(event) {\n   if(event.target.tagName && event.target.tagName.toUpperCase() == \'A\') {\n       // Either a link in the descrption, or a bomb/mailto/trash click\n       return true;\n    }\n    var id = event.currentTarget.getAttribute("selectID");\n    var viewName = event.currentTarget.getAttribute("selectViewName");\n    var area = event.currentTarget.getAttribute("selectArea");\n    var shiftKey = \'0\';\n    var ctrlKey = \'0\';\n    if(event.shiftKey) shiftKey = \'1\';\n    if(event.ctrlKey || event.metaKey) ctrlKey = \'1\';\n    eventURL(\'action:handleSelect?area=\' + area + \'&viewName=\' + viewName + \n\t\'&id=\' + id + \'&shiftDown=\' + shiftKey + \'&ctrlDown=\' + ctrlKey);\n    return true;\n}\n\nfunction handleDblClick(event, viewName, id) {\n   var target = event.target;\n   while (target != undefined && target.ondblclick === null && target.tagName.toUpperCase() != \'A\') {\n       target = target.parentNode;\n   }\n\n   if(target.tagName.toUpperCase() == \'A\') {\n       // Either a link in the descrption, or a bomb/mailto/trash click\n       return true;\n   } else {\n       return eventURL(\'action:playViewNamed?viewName=\' + viewName + \n           \'&firstItemId=\' + id);\n   }\n}\n\nfunction getKeyFromEvent(evt) {\n  var key = 0;\n  if (window.event)  {\n    key = evt.keyCode;\n  } else if (evt.which) {\n  \tkey = evt.which;\n  }\n\n  return key;\n}\n\nfunction sendKeyToSearchBox(event) {\n  if(event.altKey || event.ctrlKey || event.metaKey ||\n      (event.target.tagName && event.target.tagName.toUpperCase() == \'INPUT\'))\n      return true;\n  var key = getKeyFromEvent(event);\n  if ((key == 33) || (key == 34) || (key == 35) || (key == 36) || \n      (key == 37) || (key == 38) || (key == 39) || (key == 40))\n      return true;\n  var searchBox = document.getElementById("search-box");\n  searchBox.focus();\n  return true;\n}\n\nfunction playNewVideos(event, id) {\n  eventURL(\'action:playNewVideos?id=\' + id);\n  event.stopPropagation(); // don\'t want handleSelect to deal with this event\n  return false;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////\n\n-->\n</script>\n\n<script type="text/javascript">\n    <!-- // Protect from our XML parser, which doesn\'t know to protect <script>\n\n    var settingsMode = \'closed\';\n\n    function showSettings()\n    {\n        if(settingsMode == \'open\') return hideSettings();\n        var feedSettings = document.getElementById("feed-settings");\n        feedSettings.style.display = "block";\n        settingsMode = \'open\';\n        return false;\n    }\n\n    function hideSettings()\n    {\n        var feedSettings = document.getElementById("feed-settings");\n        feedSettings.style.display = "none";\n        settingsMode = \'closed\';\n        return false;\n    }\n\n    function setExpiration()\n    {\n        var url = "action:setExpiration";\n        var idx = document.forms[\'settings\'][\'expireAfter\'].selectedIndex;\n        var value = document.forms[\'settings\'][\'expireAfter\'].options[idx].value;\n\n        url += \'?feed=\' + document.forms[\'settings\'][\'feed\'].value;\n        if (value == \'system\' || value == \'never\')\n        {\n            url += "&type=" + value + "&time=0";\n        }\n        else\n        {\n            url += "&type=feed&time=" + value;\n        }\n\n        eventURL(url);\n    }\n\n    function setMaxNew()\n    {\n        var url = "action:setMaxNew";\n\n        url += \'?feed=\' + document.forms[\'settings\'][\'feed\'].value;\n        if (document.forms[\'settings\'][\'maxOutDownloads\'].checked)\n        {\n            var maxNew = document.forms[\'settings\'][\'maxNew\'];\n            maxNew.disabled = false;\n            if(maxNew.value == \'\') maxNew.value = \'0\';\n            if(!(parseInt(maxNew.value) >= 0)) {\n               eventURL(\'action:invalidMaxNew?value=\' + escape(maxNew.value));\n               maxNew.value = \'0\';\n            }\n            url += \'&maxNew=\' + maxNew.value;\n        }\n        else\n        {\n            document.forms[\'settings\'][\'maxNew\'].disabled = true;\n            url += \'&maxNew=-1\';\n        }\n\n        eventURL(url);\n    }\n\n    -->\n</script>\n\n\n    \n    \n</head>\n\n<body onkeydown="sendKeyToSearchBox(event);"')
  411.     out.write(u' ' + bodyTagExtra)
  412.     out.write(u'>\n\n\n<div id="main-titlebar">\n\t<div id="main-icon" class="noborder"><img src="')
  413.     out.write(quoteattr(resources.url(u'images/download-icon.png')))
  414.     out.write(u'"></img></div>\n        <h1 id="main-title">')
  415.     out.write(_(u'Downloading'))
  416.     out.write(u'</h1>\n        <div id="search-box-container">\n            <input value="')
  417.     out.write(quoteattr(_('Find')))
  418.     out.write(u'" onfocus="onSearchFocus(this)" type="search" id="search-box" onblur="endEditSearch()"></input>\n        </div>\n        <div id="downloads-global-actions">\n            <div><p id="tmplcomp78642551"')
  419.     
  420.     _hideFunc = lambda : views.downloadingItems.len() == 0
  421.     _dynHide = _hideFunc()
  422.     if _dynHide:
  423.         out.write(u' style="display:none">')
  424.     else:
  425.         out.write(u'>')
  426.     handle.addUpdateHideOnView('tmplcomp78642551', views.downloadingItems, _hideFunc, _dynHide)
  427.     out.write(u'<a href="#" onclick="return eventURL(\'action:pauseAll\');" title="Pause All"><img src="')
  428.     out.write(quoteattr(resources.url(u'images/pause-all-downloads.png')))
  429.     out.write(u'"></img><br></br><span>')
  430.     out.write(_(u'Pause All'))
  431.     out.write(u'</span></a></p> </div>\n            <div><p id="tmplcomp61307602"')
  432.     
  433.     _hideFunc = lambda : views.pausedItems.len() == 0
  434.     _dynHide = _hideFunc()
  435.     if _dynHide:
  436.         out.write(u' style="display:none">')
  437.     else:
  438.         out.write(u'>')
  439.     handle.addUpdateHideOnView('tmplcomp61307602', views.pausedItems, _hideFunc, _dynHide)
  440.     out.write(u'<a href="#" onclick="return eventURL(\'action:resumeAll\');" title="Resume All"><img src="')
  441.     out.write(quoteattr(resources.url(u'images/resume-all-downloads.png')))
  442.     out.write(u'"></img><br></br><span>')
  443.     out.write(_(u'Resume All'))
  444.     out.write(u'</span></a></p> </div>\n        </div>\n\n        <div id="download-info">\n            <ul>\n                <li>\n                    <span>')
  445.     tmplcomp28566573 = { }
  446.     tmplcomp78312817 = StringIO()
  447.     tmplcomp78312817.write(u'<span>')
  448.     tmplcomp78312817.write(escape(getFreeSpace()))
  449.     tmplcomp78312817.write(u'</span>')
  450.     tmplcomp78312817.seek(0)
  451.     tmplcomp28566573['size'] = tmplcomp78312817.read()
  452.     out.write(Template(_(u'${size} free on disk')).substitute(tmplcomp28566573))
  453.     out.write(u'</span>\n                </li>\n                <li>\n                    ')
  454.     out.write(u'<span id="tmplcomp80638800"/>\n                </li>\n            </ul>\n            ')
  455.     out.write(u'<span id="tmplcomp88112482"/>\n        </div>\n</div>\n\n\n<div id="main-container">\n        <div class=')
  456.     out.write(quoteAndFillAttr(u'main-channelbar downloading-channelbar no-arrow', locals()))
  457.     out.write(u' id="tmplcomp69515374"')
  458.     
  459.     _hideFunc = lambda : allNormalDownloads.len() == 0
  460.     _dynHide = _hideFunc()
  461.     if _dynHide:
  462.         out.write(u' style="display:none">')
  463.     else:
  464.         out.write(u'>')
  465.     handle.addUpdateHideOnView('tmplcomp69515374', allNormalDownloads, _hideFunc, _dynHide)
  466.     out.write(u'\n                <span>')
  467.     out.write(_(u'Channel Downloads'))
  468.     out.write(u'</span>\n        </div>\n\n     \n    ')
  469.     out.write(u'<span id="tmplcomp97887793"/> \n    \n\n\t\n    <div id="tmplcomp76085414">')
  470.     out.write(u'</div>\n    <div id="tmplcomp83877438">')
  471.     out.write(u'</div>\n    <div id="tmplcomp01838538">')
  472.     out.write(u'</div>\n\t\n    ')
  473.     out.write(u'<span id="tmplcomp22972243"/> \n    <div id="tmplcomp12152205">')
  474.     out.write(u'</div>\n\n    ')
  475.     out.write(u'<span id="tmplcomp18152374"/>\n    <div id="tmplcomp99504900">')
  476.     out.write(u'</div>\n</div>\n\n</body>\n</html>')
  477.     out.seek(0)
  478.     return (out, handle)
  479.  
  480.